﻿Option Explicit On
Option Strict On

''' <summary>
''' Formulario Facturar: Para hacer facturas de la cita actual
''' </summary>
''' <author>Julio Antoranz</author>

Public Class btFacturar

    Private _miBBDD As BBDD
    Private _fecha As DateTime
    Private _cita As Cita
    Private _cliente As Cliente
    Private _user As Usuario
    Private _listaServicios As List(Of Servicio)


    Private Sub btCobrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btCobrar.Click

        Dim _factura As Factura
        _factura = New Factura


        

        Try

            _fecha = New DateTime(dtpFechaCita.Value.Year, dtpFechaCita.Value.Month, _
                              dtpFechaCita.Value.Day, CInt(tbHora.Text.Split(":"c)(0)), CInt(tbHora.Text.Split(":"c)(1)), 0)


            _factura.Cobro = CSng(tbPrecio.Text)
            _factura.Descuento = CSng(tbDescuento.Text)
            _factura.Fecha = _fecha

            If btAñadir.Enabled Then
                ' Si es una factura de una cita nueva creo la cita en la base de datos antes

                _miBBDD.Conectar()
                _user = _miBBDD.DevuelveUsuario("Select * from empleado where dni = '" & tbUDni.Text & "'")
                _cliente = _miBBDD.DevuelveCliente("select * from cliente where nombre = '" & tbCNombre.Text & _
                                                   "' and apellidos = '" & tbApellidos.Text & "'")
                _miBBDD.InsertarCita(New Cita(0, _cliente.Codigo, _user.Codigo, _fecha))
                _cita = _miBBDD.DevuelveCita("Select * from cita where cod_cliente = " & _cliente.Codigo & " and " & _
                                             "cod_empleado = " & _user.Codigo & " and fecha = #" & _
                                             _fecha.ToString("dd/MM/yyyy HH:mm:ss") & "#")
                For Each fila As DataGridViewRow In dgvConceptos.Rows
                    _miBBDD.InsertarConcepto(New Concepto(CInt(fila.Cells.Item(0).Value), _cita.Codigo))
                Next
                _factura.CodigoCita = _cita.Codigo
                _miBBDD.InsertarFactura(_factura)
                _miBBDD.Desconectar()

            Else
                'Si recoge datos de una cita inserto directamente la factura

                _factura.CodigoCita = _cita.Codigo
                _factura.Fecha = _fecha

                _miBBDD.Conectar()
                _miBBDD.InsertarFactura(_factura)
                _miBBDD.Desconectar()
            End If

            Me.Close()
        Catch ex As Exception
            MsgBox("Hubo un error conectando con la Base de Datos", MsgBoxStyle.Information, Me.Text)
        End Try

    End Sub

    Private Sub btCancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btCancelar.Click
        Me.Close()
    End Sub


    Private Sub Facturar_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        _miBBDD = New BBDD
        _fecha = DateTime.Now
        tbHora.Text = _fecha.ToString("HH:mm")
        dtpFechaCita.Text = _fecha.ToString("D")

        Try
            _miBBDD.Conectar()
            _listaServicios = _miBBDD.ListaServicios("Select * from servicios order by nombre")
            _miBBDD.Desconectar()

            For Each serv As Servicio In _listaServicios
                cbServicios.Items.Add(serv.Nombre)
            Next
        Catch ex As Exception
            MsgBox("Hubo un error conectando con la Base de Datos", MsgBoxStyle.Information, Me.Text)
        End Try

    End Sub

    Private Sub ActualizarCamposFactura()

        ' Rellenamos los campos de cliente y usuario
        tbCNombre.Text = _cliente.Nombre
        tbApellidos.Text = _cliente.Apellidos
        tbUDni.Text = _user.DNI
    End Sub


    ' Recoge los datos de una cita
    Public Sub CrearFactura(ByVal codCita As Integer)

        Try

            _miBBDD.Conectar()
            _cita = _miBBDD.DevuelveCita("Select * from cita where cod = " & codCita)
            _user = _miBBDD.DevuelveUsuario("Select * from empleado where cod = " & _cita.CodigoUsuario)
            _cliente = _miBBDD.DevuelveCliente("Select * from cliente where cod = " & _cita.CodigoCliente)
            For Each concept As Concepto In _miBBDD.ListaConceptos("Select * from concepto where cod_cita = " & _cita.Codigo)
                añadirServicio(CInt(concept.CodigoServicio))
            Next
            _miBBDD.Desconectar()

            ActualizarCamposFactura()
            btAñadir.Enabled = False
        Catch ex As Exception
            MsgBox("Hubo un error conectando con la Base de Datos", MsgBoxStyle.Information, Me.Text)
        End Try
    End Sub


    Private Sub btAñadir_Click(sender As System.Object, e As System.EventArgs) Handles btAñadir.Click

        If cbServicios.SelectedIndex <> -1 Then
            añadirServicio(_listaServicios(cbServicios.SelectedIndex).Cod)
        End If
    End Sub


    Private Sub ActualizarPrecios()
        Try
            Dim precio As Single
            Dim descuento As Single
            precio = 0.0F

            ' calculamos el precio
            For Each fila As DataGridViewRow In dgvConceptos.Rows
                precio += CSng(fila.Cells(2).Value)

            Next

            tbPrecio.Text = precio.ToString("0.00") ' se actualiza el precio aqui por si en el descuento falla

            ' comprobamos si hay descuento
            descuento = CSng(tbDescuento.Text)

            If descuento <> 0.0F Then
                precio = precio * (1.0F - (descuento / 100.0F))
                tbPrecio.Text = precio.ToString("0.00")
            End If
        Catch ex As Exception
            MsgBox("Hubo un error calculando el precio", MsgBoxStyle.Information, Me.Text)
        End Try
    End Sub


    ' Actualiza el textbox de Cambio
    Private Sub tbPagado_TextChanged(sender As System.Object, e As System.EventArgs) Handles tbPagado.TextChanged

        Try
            Dim precio As Single = CSng(tbPrecio.Text)
            Dim pagado As Single = CSng(tbPagado.Text)

            tbCambio.Text = (pagado - precio).ToString("0.00")
        Catch ex As Exception
            MsgBox("Hubo un error calculando el cambio", MsgBoxStyle.Information, Me.Text)
        End Try

    End Sub


    ' Añade una fila al datagridview
    Private Sub añadirServicio(ByVal codigoServicio As Integer)
        Dim servicioAñadido As Boolean
        Dim pos As Integer

        servicioAñadido = False

        ' se localiza el servicio que se quiere insertar
        For Each serv As Servicio In _listaServicios
            If serv.Cod = codigoServicio Then
                pos = _listaServicios.IndexOf(serv)
            End If
        Next

        For Each fila As DataGridViewRow In dgvConceptos.Rows
            If CInt(fila.Cells(0).Value) = _listaServicios(pos).Cod Then
                servicioAñadido = True
            End If
        Next

        ' si el servicio no está añadido se inserta en el datagridview
        If Not servicioAñadido Then
            dgvConceptos.Rows.Add(_listaServicios(pos).Cod, _listaServicios(pos).Nombre, _
                                  _listaServicios(pos).Precio, _listaServicios(pos).Descripcion)

            ActualizarPrecios()
        End If
    End Sub

    Private Sub tbDescuento_TextChanged(sender As System.Object, e As KeyPressEventArgs) Handles tbDescuento.KeyPress
        If ("0132456798").IndexOf(e.KeyChar) >= 0 Or e.KeyChar = Keys.Delete.ToString Or _
            e.KeyChar = "-"c Or e.KeyChar = Keys.Cancel.ToString Then

            e.Handled = False
        Else
            e.Handled = True
        End If
    End Sub


    Private Sub tbDescuento_TextChanged(sender As System.Object, e As System.EventArgs) Handles tbDescuento.LostFocus
        ActualizarPrecios()
    End Sub
End Class